<?php
/**
 * Description of CategoriaProdutoDAO
 *
 * @author Magno
 */
class CidadeDAO {

    private $conexao;
    public function __construct() {
        $this->conexao = Conexao::getConexao();
    }

    public function salvar($cidade) {

        try {

            $estadoDAO = new EstadoDAO();

            if($cidade->getEstado()->getEstadoID() == null || $cidade->getEstado()->getEstadoID() <= 0)
                $cidade->setEstado($estadoDAO->salvar($cidade->getEstado()));

            if($cidade->getCidadeID() != null && $cidade->getCidadeID() > 0) {
                $statment = $this->conexao->prepare("UPDATE cidade SET
                        nome = :nome,
                        estadoID = :estadoID
                        WHERE cidadeID = :cidadeID");

            }else {
                $statment = $this->conexao->prepare("INSERT INTO cidade(cidadeID,nome,estadoID) VALUES (:cidadeID,:nome,:estadoID);");
            }

            if($statment->execute($cidade->toBD())) {

                if($cidade->getCidadeID() == null || $cidade->getCidadeID() <= 0)
                    $cidade->setCidadeID($this->conexao->lastInsertId());
                return $cidade;

            }else {
                $erros = $statment->errorInfo();
                throw new Exception("Erro CidadeDAO: ".$erros[2]);
            }

        }catch(PDOException $err) {
            throw new Exception("Erro CidadeDAO:".$err->getMessage());
        }

    }

    public function excluir($cidadeID) {

        try {

            $statment = $this->conexao->prepare("DELETE FROM cidade WHERE cidadeID = :cidadeID");
            $statment->bindParam(':cidadeID',$cidadeID);

            if(!$statment->execute()) {
                $erros = $statment->errorInfo();
                throw new Exception("Erro CidadeDAO: ".$erros[2]);
            }

        }catch(PDOException $err) {
            throw new Exception("Erro CidadeDAO:".$err->getMessage());
        }

    }

    public function listar($pagina = 0,$nome = "", $estadoID = 0) {
        try {
            
            $estadoDAO = new EstadoDAO();

            $limite = Util::getPaginacao($pagina);
            $where = $this->getWhere($nome,$estadoID);
            $cidades = array();            
            $statment = $this->conexao->query( "SELECT * FROM cidade c $where $limite" );

            foreach ( $statment->fetchAll(PDO::FETCH_SERIALIZE) as $row ) {
                $cidade = new CidadeBean($row['cidadeID'], $row['nome']);
                $cidade->setEstado($estadoDAO->buscarPorID($row['estadoID']));
                $cidades[] = $cidade;
            }

            return $cidades;

        }catch(PDOException $err) {
            throw new Exception("Erro CidadeDAO:".$err->getMessage());
        }
    }

    public function buscarPorID($cidadeID) {
        try {
            $estadoDAO = new EstadoDAO();            
            $row = $this->conexao->query("SELECT * FROM cidade WHERE cidadeID = $cidadeID ")->fetch(PDO::FETCH_SERIALIZE);

            if(isset($row['cidadeID']) && $row['cidadeID'] > 0) {
                $cidade = new CidadeBean($row['cidadeID'], $row['nome']);
                $cidade->setEstado($estadoDAO->buscarPorID($row['estadoID']));
                return $cidade;
            }else {
                return null;
            }


        }catch(PDOException $err) {
            throw new Exception("Erro CidadeDAO:".$err->getMessage());
        }
    }
    
    public function buscarPorSiglaEstadoENome($siglaEstado, $nome) {
        try {
            
            $estadoDAO = new EstadoDAO();            
            $row = $this->conexao->query("SELECT c.* FROM estado e INNER JOIN cidade c 
                    on c.estadoID = e.estadoID WHERE e.sigla = '$siglaEstado' AND c.nome = '$nome'")->fetch(PDO::FETCH_SERIALIZE);

            if(isset($row['cidadeID']) && $row['cidadeID'] > 0) {
                $cidade = new CidadeBean($row['cidadeID'], $row['nome']);
                $cidade->setEstado($estadoDAO->buscarPorID($row['estadoID']));
                return $cidade;
            }else {
                return null;
            }


        }catch(PDOException $err) {
            throw new Exception("Erro CidadeDAO:".$err->getMessage());
        }
    }

    private function getWhere($nome="",$estadoID = 0) {
        $where = " WHERE 1 = 1 ";

        if (isset ($nome) && strlen($nome) > 0) {
            $where = $where." AND c.nome = '$nome' ";
        }

        if (isset ($estadoID) && $estadoID > 0) {
            $where = $where." AND c.estadoID = $estadoID ";
        }

        return $where;
    }

    public function total($nome = "",$estadoID = 0) {
        try {

            $where = $this->getWhere($nome);
            $total = $this->conexao->query( "SELECT COUNT(c.cidadeID) total FROM cidade c $where" )->fetch(PDO::FETCH_COLUMN);
            return $total;

        }catch(PDOException $err) {
            throw new Exception("Erro CidadeDAO:".$err->getMessage());
        }
    }

}
?>